<?php
namespace app\admin\controller;
use think\Controller;
use think\facade\Request;
use app\admin\model\AdminRules as Rules;
use app\facade\WebTool;
use think\Exception;
class AdminRules extends Controller
{
	// 设置中间件
	protected $middleware =  [ 'AdminRulesCheck', ];
	// 规则添加接口参数控制
	protected $addParam = ['pid','title','name','type','status','note','sort','token'];
	// 规则编辑接口参数控制
	protected $editParam = ['id','title','name','type','status','note','sort','token'];
	// 规则获取接口参数控制（单条）
	protected $getParam = ['id'];

	public function list() { return view(); }
	public function add() { return view(); }
	public function edit() { return view(); }

	/**
	 * ParamDispose 参数进行提取处理
	 * @param array $array 允许访问的参数
	 * @param string $scene 提取场景
	 * @param object $model 模型对象
	 * @return  array 可用的请求参数
	 */
	private static function ParamDispose($array,$scene='',$model='')
	{
		// 请求参数获取
		$param = Request::param();
		// 场景执行
		switch ($scene)
		{
			// 如果场景是某种场景的判断
			case 'pid':
				foreach ($param as $key => $val) { if (!in_array($key, $this->addParam)) unset($param[$key]); }
				// 如果pid 不为0的情况 查出等级 并且+1做当前等级
				if (0!== $param['pid']) $param['level'] = $ojbect->getField('id',$param['pid'],'level')+1;
			break;	
			// 默认执行方案
			default:
				foreach ($param as $key => $val) { if (!in_array($key, $array)) unset($param[$key]); }
			break;
		}
		// 返回参数
		return $param;
	}
 
 	/**
	 * listGroup权限列表接口
	 * @return array 返回空数据或者权限组数据
	 */
	public function listRulse()
	{
		// 实例化权限规则数据
		$rules = new Rules();
		// 进行列表数据查询，查出所有权限规则
		$list = $rules->rulesList();
		// 如果为空的判断
		if (empty($list)) return ['code'=>1,'msg'=>'Rules_List_Get_Empty','data'=>false];
		// 提取页面数据
		$data['page'] = $list->render();
		// 转换对象为数组
		$data['data'] = $list->toArray()['data'];
		// 返回查询后的权限规则数据内容
		return ['code'=>0,'msg'=>'Success','data'=>$data];
	}

	/**
	 * listGroup权限列表接口
	 * @return array 返回空数据或者权限组数据
	 */
	public function listTree()
	{
		// 实例化权限规则数据
		$rules = new Rules();
		// 进行列表数据查询，查出所有权限规则
		$data = $rules->rulesList();
		// 如果为空的判断
		if (empty($data)) return ['code'=>1,'msg'=>'Rules_List_Get_Empty','data'=>false];
		// 进行数据排序，使用工具类
		$data = WebTool::bubbleSort($data);
		// 进行数据处理
		$data = self::listRulseShow($data);
		// 返回查询后的权限规则数据内容
		return ['code'=>0,'msg'=>'Success','data'=>$data];
	}
	
	/**
	 * listRulseShow 处理列表结构展示以及数据展示
	 * @param  array $data 传入规则的所有数据
	 * @return array            返回处理渲染后的数据
	 */
	private static function listRulseShow($data)
	{

		// 进行数据重新提取 以键值对形式，结果赋值给pid 
		$pid = WebTool::arrayKeyValPair($data,'id','title');
		// 增加一个所以当为0的时候
		$pid[0] = '顶级权限';
		// 循环数据
		foreach ($data as $key => $val)
		{
			// 权限道标题进行优化处理 进行字符串重复输出拼接内容 存入data
			if ($val['level'] == 1) $data[$key]['title'] = ''.$val['title'];
			// 平道标题的排序样式子集显示效果 存入data
			else $data[$key]['title'] = '|'.str_repeat('—', $val['level']-1).$val['title'];
		}
		// 循环数据
		foreach ($data as $key => $val)
		{
			// 对权限级别自己字段进行优化处理
			$data[$key]['level'] = $val['level'].'级';
			// 对显示状态进行优化处理 是现实或者隐藏
			if (1 == $val['status']) $data[$key]['status'] = '显示';
			else $data[$key]['status'] = '隐藏';
			// 对pid 进处理
			$data[$key]['pid'] = $pid[$val['pid']];
		}
		return $data;
	}

	/**
	 * rulesSelect 下拉列表接口
	 * @return array 返回空或者返回结果
	 */
	public function rulesSelect()
	{
		// 实例化权限规则数据
		$rules = new Rules();
		// 进行select下拉列表数据查找
		$rulesList = $rules->rulesSelect();
		// 如果为空的判断
		if (empty($rulesList)) return ['code'=>1,'msg'=>'Rules_Select_Get_Empty','data'=>false];
		// 进行数据排序
		$rulesList = WebTool::bubbleSort($rulesList);
		// 数据遍历展示给前台用
		$data = self::ruleSelectShow($rulesList);
		// 返回查询后的权限规则数据内容
		return ['code'=>0,'msg'=>'Success','data'=>$data];
	}

	/**
	 * ruleSelectShow 下拉列表框前端输出字符处理
	 * @param  array $rulesList 传入下拉列表数组
	 * @return array            返回处理完成之后的数据
	 */
	private static function ruleSelectShow($rulesList)
	{
		// 循环下拉列表数据 对等级递进关系与标题显示进行处理
		foreach ($rulesList as $key => $val)
		{
			// 如果等级为1 默认显示
			if ($val['level'] == 1) $rulesList[$key]['title'] = $val['title'].'&nbsp;'.$val['level'].'级';
			// 否则进行字符串重复输出拼接内容
			else $rulesList[$key]['title'] = str_repeat('&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;', ($val['level']-1)*1).'&nbsp;'.$val['title'].$val['level'].'级';
		}
		// 循环下拉列表数据 删除不需要用到的数组内容
		foreach ($rulesList as $key => $val)
		{
			foreach ($val as $k => $v)
			{
				if ($k === 'pid') unset($rulesList[$key][$k]);
				if ($k === 'level') unset($rulesList[$key][$k]);
			}
		}
		// 进行数据提取
		$data = WebTool::arrayKeyValPair($rulesList,'id','title');
		return $data;
	}

	/**
	 * getRulse 权限详情获取
	 * @return array 返回空或者数据
	 */
	public function getRulse()
	{
		// 实例化模型
		$rules = new Rules();
		// 参数获取
		$param = self::ParamDispose($this->getParam);
		// 进行请求信息验证
		$res = $this->validate($param,'AdminRules.ruleid');
		// 如果验证失败则返回错误信息
		if (true !== $res) return ['code'=>1,'msg'=>$res,'data'=>''];
		// 进行单个详细规则查询
		$rulesData = $rules->rulesGet($param['id']);
		// 如果为空的判断
		if (empty($rulesData)) return ['code'=>1,'msg'=>'Rules_Detail_Error','data'=>''];
		// 返回查询后的数据
		return ['code'=>0,'msg'=>'Seccess','data'=>$rulesData];
	}

	/**
	 * addRules 权限添加接口
	 * @return array 返回添加是否成功
	 */
	public function addRules()
	{
		// 实例化模型
		$rules = new Rules();
		// 参数获取
		$param = self::ParamDispose($this->addParam,'pid',$rules);
		// 进行请求信息验证
		$res = $this->validate($param,'AdminRules.ruleadd');
		// 如果验证失败则返回错误信息
		if (true !== $res) return ['code'=>1,'msg'=>$res,'data'=>false];
		// 将数据传入模型层进行模型添加处理 并且返回添加结果
		$res = $rules->rulesAdd($param);
		// 如果数据失败抛出异常 返回错误信息
		if (true !== $res) return ['code'=>1,'msg'=>'Rules_Add_Error','data'=>false];
		// 成功返回信息
		return ['code'=>0,'msg'=>'Success','data'=>true];
	}

	/**
	 * editRules 权限编辑接口
	 * @return array 返回编辑是否成功
	 */
	public function editRules()
	{
		// 实例化模型
		$rules = new Rules();
		// 参数获取
		$param = self::ParamDispose($this->editParam);
		// 进行请求信息验证
		$res = $this->validate($param,'AdminRules.ruleedit');
		// 如果验证失败则返回错误信息
		if (true !== $res) return ['code'=>1,'msg'=>$res,'data'=>false];
		// 将数据传入模型层进行模型添加处理 并且返回添加结果
		$res = $rules->rulesEdit($param['id'],$param);
		// 如果数据失败抛出异常 返回错误信息
		if (true !== $res) return ['code'=>1,'msg'=>'Rules_Edit_Error','data'=>false];
		// 成功返回信息
		else return ['code'=>0,'msg'=>'Success','data'=>true];
	}

	/**
	 * delRules 权限删除接口
	 * @return array 返回删除成功或者失败
	 */
	public function delRules()
	{
		// 实例化模型
		$rules = new Rules();
		// 参数获取
		$param = self::ParamDispose($this->editParam);
		// 进行请求信息验证
		$res = $this->validate($param,'AdminRules.ruleid');
		// 如果验证失败则返回错误信息
		if (true !== $res) return ['code'=>1,'msg'=>$res,'data'=>''];
		// 进行单个详细规则查询
		$rulesData = $rules->rulesDel($param['id']);
		// 如果为空的判断
		if (empty($rulesData)) return ['code'=>1,'msg'=>'Rules_Get_Error','data'=>''];
		// 返回查询后的数据
		return ['code'=>0,'msg'=>'Seccess','data'=>$rulesData];
	}

}
